﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Data;
using Entity;
using System.Collections;

namespace Business
{
    /// <summary>
    /// Ce service gère les informations des utilisateurs.
    /// </summary>
    public class UtilisateurService
    {
        /// <summary>
        /// Créer un utilisateur.
        /// </summary>
        /// <param name="prenom">Prénom de l'utilisateur</param>
        /// <param name="nom">Nom de l'utilisateur</param>
        /// <param name="email">E-mail de l'utilisateur</param>
        /// <param name="password">Mot de passe de l'utilisateur</param>
        /// <param name="sexe">Sexe de l'utilisateur</param>
        /// <param name="filiere">Fillière de l'utilisateur</param>
        /// <param name="promotion">Promotion de l'utilisateur</param>
        /// <param name="datenaissance">Date de naissance de l'utilisateur</param>
		/// <returns>L'utilisateur créé</returns>
        public static Utilisateur creerUtilisateur(String prenom,
            String nom,
            String email,
            String password,
            char sexe,
            String filliere,
            int promotion,
            DateTime datenaissance)
        {
            return UtilisateurData.ajouterUtilisateur(prenom, nom, email, password, sexe, filliere, promotion, datenaissance);
        }

        /// <summary>
        /// Met à jour un utilisateur.
        /// </summary>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur à modifier</param>
        /// <param name="prenom">Prénom de l'utilisateur</param>
        /// <param name="nom">Nom de l'utilisateur</param>
        /// <param name="email">E-mail de l'utilisateur</param>
        /// <param name="password">Mot de passe de l'utilisateur</param>
        /// <param name="sexe">Sexe de l'utilisateur</param>
        /// <param name="filiere">Fillière de l'utilisateur</param>
        /// <param name="promotion">Promotion de l'utilisateur</param>
        /// <param name="datenaissance">Date de naissance de l'utilisateur</param>
        public static void majUtilisateur(int idutilisateur,
            String prenom,
            String nom,
            String email,
            String password,
            char sexe,
            String filliere,
            int promotion,
            DateTime datenaissance)
        {
            UtilisateurData.majUtilisateur(idutilisateur, prenom, nom, email, password, sexe, filliere, promotion, datenaissance);
        }

        /* Non utilisé.
         * Laissé ici au cas où.
        /// <summary>
        /// Supprime un utilisateur.
        /// </summary>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur à supprimer</param>
        public static void supprimerUtilisateur(int idUtilisateur)
        {
            UtilisateurData.supprimerUtilisateur(idUtilisateur);
        }*/

        /// <summary>
        /// Retourne les informations d'un utilisateur par son identifiant.
        /// </summary>
        /// <param name="idutilisateur">L'identifiant de l'utilisateur.</param>
        /// <returns>L'utilisateur recherché, ou null s'il n'existe pas</returns>
        public static Utilisateur getUtilisateur(int idutilisateur)
        {
            return UtilisateurData.getUtilisateur(idutilisateur);
        }

        /// <summary>
        /// Retourne les informations d'un utilisateur par son email et mot de passe.
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <param name="password">Le mot de passe de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static Utilisateur getUtilisateur(String email, String password)
        {
            return UtilisateurData.getUtilisateur(email, password);
        }

		/// <summary>
        /// Indique si l'e-mail est déjà enregistré sur un utilisateur.
        /// </summary>
        /// <param name="email">L'email de l'utilisateur</param>
        /// <returns>true si l'e-mail existe en base, false sinon</returns>
        public static bool emailExiste(String email)
        {
            return (UtilisateurData.getUtilisateur(email) != null);
        }

        /// <summary>
        /// Retourne une liste des utilisateurs ayant les mots de la chaine "recherche"
        /// dans leur nom ou leur prénom.
        /// </summary>
        /// <param name="recherche">Un ensemble de mot recherchés</param>
        /// <returns>La liste des utilisteurs correspondant à la recherche, ou</returns>
        public static List<Utilisateur> rechercherUtilisateurs(String recherche)
        {
            List<Utilisateur> liste = new List<Utilisateur>();

            // On épure tous les espaces
            string[] motcles = recherche.Split(' ');
            foreach (string motcle in motcles)
            {
                if (motcle != "")
                {
                    // On recherche le mot clé
                    List<Utilisateur> listeUnitaire = UtilisateurData.rechercherUtilisateur(motcle);

                    // On ajoute à la liste des résultats
                    if (listeUnitaire != null)
                        liste.AddRange(listeUnitaire);
                }
            }

            // On supprime les doublons
            liste = liste.Distinct(new CompatateurUtilisateur()).ToList();

            // On retourne null si aucun resultat
            if (liste.Count == 0)
                return null;

            // On trie tous les résultats
            liste.Sort(new CompatateurUtilisateur());
            return liste;
        }


        /// <summary>
        /// Retourne les utilisateurs ayant la promotion donnée.
        /// </summary>
        /// <param name="email">La promotion de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static List<Utilisateur> rechercherUtilisateursParFilliere(String filliere)
        {
            return UtilisateurData.rechercherUtilisateurParFilliere(filliere);
        }


        /// <summary>
        /// Retourne les utilisateurs ayant la promotion donnée.
        /// </summary>
        /// <param name="email">La promotion de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static List<Utilisateur> rechercherUtilisateursParPromotion(int promotion)
        {
            return UtilisateurData.rechercherUtilisateurParPromotion(promotion);
        }


        /// <summary>
        /// Retourne les utilisateurs ayant la promotion donnée.
        /// </summary>
        /// <param name="email">La promotion de l'utilisateur</param>
        /// <returns>L'utilisateur ou alors null s'il n'existe pas</returns>
        public static List<Utilisateur> rechercherUtilisateursParFilliereEtPromotion(String filliere, int promotion)
        {
            return UtilisateurData.rechercherUtilisateursParFilliereEtPromotion(filliere, (int)promotion);
        }


        /// <summary>
        /// Permet de comparer deux utilisateurs.
        /// </summary>
        private class CompatateurUtilisateur : IComparer<Utilisateur>, IEqualityComparer<Utilisateur>
        {

            // Egalitée
            public bool Equals(Utilisateur u1, Utilisateur u2)
            {
                return u1.idutilisateur == u2.idutilisateur;
            }

            // HashCode
            public int GetHashCode(Utilisateur u)
            {
                return u.idutilisateur.GetHashCode();
            }

            // Comparaison
            public int Compare(Utilisateur u1, Utilisateur u2)
            {
                if (u1.nom == u2.nom)
                    return u1.prenom.CompareTo(u2.prenom);
                else
                    return u1.nom.CompareTo(u2.nom);
            }
        }

    }
}
